package com.ng.desktop.expansionsa.model;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.apache.commons.collections.CollectionUtils;
import org.hibernate.annotations.ForeignKey;

@Entity
@Table(name = "EX_ALQUILER")
public class Alquiler {

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	@Column(name = "ID", nullable = false)
	private Long id;

	@Column(name = "FECHA", nullable = false)
	private Date fecha;

	@ManyToOne
	@JoinColumn(name = "ID_CLIENTE", referencedColumnName = "ID")
	@ForeignKey(name = "FK_CLIENTE")
	private Cliente cliente;
	
	@Column(name = "DIRECCION_OBRA", nullable = false)
	private String direccionObra;

	@Enumerated(EnumType.STRING)
	@Column(name = "ESTADO_ALQUILER", nullable = false)
	private EstadoAlquiler estadoAlquiler;

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	@JoinTable(name = "EX_DETALLES_AQLUILER", joinColumns = @JoinColumn(name = "ID_ALQUILER"), inverseJoinColumns = @JoinColumn(name = "ID_DETALLE"))
	private List<Detalle> detalles;

	@Column(name = "OBSERVACIONES", nullable = false)
	private String observaciones;
	
	public final Long getId() {
		return id;
	}

	public final void setId(Long id) {
		this.id = id;
	}

	public final Date getFecha() {
		return fecha;
	}

	public final void setFecha(Date fecha) {
		this.fecha = fecha;
	}

	public final Cliente getCliente() {
		return cliente;
	}

	public final void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public final EstadoAlquiler getEstadoAlquiler() {
		return estadoAlquiler;
	}

	public final void setEstadoAlquiler(EstadoAlquiler estadoAlquiler) {
		this.estadoAlquiler = estadoAlquiler;
	}

	public final List<Detalle> getDetalles() {
		return detalles;
	}

	public final void setDetalles(List<Detalle> detalles) {
		this.detalles = detalles;
	}

	public final String getObservaciones() {
		return observaciones;
	}

	public final void setObservaciones(String observaciones) {
		this.observaciones = observaciones;
	}

	public final String getDireccionObra() {
		return direccionObra;
	}

	public final void setDireccionObra(String direccionObra) {
		this.direccionObra = direccionObra;
	}
	
	public final Double getMonto() {
		Double monto = 0d;
		
		if(detalles != null) {
			for(Detalle detalle : detalles) {
				monto += (detalle.getCantidad() * detalle.getPrecio());
			}
		} 
		
		return monto;
	}
	
	public final Boolean getAlerta() {
		boolean alerta = false;
		
		if(detalles != null) {
			Calendar hoy = Calendar.getInstance();
			this.redondearFecha(hoy);
			
			if(CollectionUtils.isNotEmpty(detalles)) {
				for(Detalle detalle : detalles) {
					
					Calendar fechaDevolucion = Calendar.getInstance();
					fechaDevolucion.setTime(detalle.getFechaDevolucion());
					this.redondearFecha(fechaDevolucion);
					
					if(fechaDevolucion.before(hoy)) {
						alerta = true;
						break;
					}
				}
			}
			
		}
		
		return alerta;
	}
	
	private void redondearFecha(Calendar c) {
		c.set(Calendar.HOUR_OF_DAY, 0);
		c.set(Calendar.MINUTE, 0);
		c.set(Calendar.SECOND, 0);
		c.set(Calendar.MILLISECOND, 0);
	}


}
